{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.datasets import load_iris\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Iris数据集是常用的分类实验数据集，由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集，是一类多重变量分析的数据集。数据集包含150个数据样本，分为3类，每类50个数据，每个数据包含4个属性。可通过花萼长度，花萼宽度，花瓣长度，花瓣宽度4个属性预测鸢尾花卉属于（Setosa，Versicolour，Virginica）三个种类中的哪一类。\n",
    "\n",
    "iris以鸢尾花的特征作为数据来源，常用在分类操作中。该数据集由3种不同类型的鸢尾花的各50个样本数据构成。其中的一个种类与另外两个种类是线性可分离的，后两个种类是非线性可分离的。\n",
    "该数据集包含了4个属性：\n",
    "\n",
    "- Sepal.Length（花萼长度），单位是cm;\n",
    "- Sepal.Width（花萼宽度），单位是cm;\n",
    "- Petal.Length（花瓣长度），单位是cm;\n",
    "- Petal.Width（花瓣宽度），单位是cm;\n",
    "\n",
    "种类：Iris Setosa（山鸢尾）、Iris Versicolour（杂色鸢尾），以及Iris Virginica（维吉尼亚鸢尾）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)\n",
      "0                  5.1               3.5                1.4               0.2\n",
      "1                  4.9               3.0                1.4               0.2\n",
      "2                  4.7               3.2                1.3               0.2\n",
      "3                  4.6               3.1                1.5               0.2\n",
      "4                  5.0               3.6                1.4               0.2\n",
      "..                 ...               ...                ...               ...\n",
      "145                6.7               3.0                5.2               2.3\n",
      "146                6.3               2.5                5.0               1.9\n",
      "147                6.5               3.0                5.2               2.0\n",
      "148                6.2               3.4                5.4               2.3\n",
      "149                5.9               3.0                5.1               1.8\n",
      "\n",
      "[150 rows x 4 columns]\n",
      "     sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  \\\n",
      "0                  5.1               3.5                1.4               0.2   \n",
      "1                  4.9               3.0                1.4               0.2   \n",
      "2                  4.7               3.2                1.3               0.2   \n",
      "3                  4.6               3.1                1.5               0.2   \n",
      "4                  5.0               3.6                1.4               0.2   \n",
      "..                 ...               ...                ...               ...   \n",
      "145                6.7               3.0                5.2               2.3   \n",
      "146                6.3               2.5                5.0               1.9   \n",
      "147                6.5               3.0                5.2               2.0   \n",
      "148                6.2               3.4                5.4               2.3   \n",
      "149                5.9               3.0                5.1               1.8   \n",
      "\n",
      "     label  \n",
      "0        0  \n",
      "1        0  \n",
      "2        0  \n",
      "3        0  \n",
      "4        0  \n",
      "..     ...  \n",
      "145      2  \n",
      "146      2  \n",
      "147      2  \n",
      "148      2  \n",
      "149      2  \n",
      "\n",
      "[150 rows x 5 columns]\n"
     ]
    }
   ],
   "source": [
    "# 加载数据\n",
    "iris = load_iris()\n",
    "# 将数据转换成DataFrame数据结构，这里的DataFrame是Pandas库里的数据结构\n",
    "df = pd.DataFrame(iris.data, columns=iris.feature_names)\n",
    "print(df)\n",
    "# 给df加上标签数据，标签[0,1,2]对应鸢尾花的三种分类\n",
    "df['label'] = iris.target\n",
    "print(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2    50\n",
      "1    50\n",
      "0    50\n",
      "Name: label, dtype: int64\n",
      "     sepal length  sepal width  petal length  petal width  label\n",
      "0             5.1          3.5           1.4          0.2      0\n",
      "1             4.9          3.0           1.4          0.2      0\n",
      "2             4.7          3.2           1.3          0.2      0\n",
      "3             4.6          3.1           1.5          0.2      0\n",
      "4             5.0          3.6           1.4          0.2      0\n",
      "..            ...          ...           ...          ...    ...\n",
      "145           6.7          3.0           5.2          2.3      2\n",
      "146           6.3          2.5           5.0          1.9      2\n",
      "147           6.5          3.0           5.2          2.0      2\n",
      "148           6.2          3.4           5.4          2.3      2\n",
      "149           5.9          3.0           5.1          1.8      2\n",
      "\n",
      "[150 rows x 5 columns]\n"
     ]
    }
   ],
   "source": [
    "df.columns = [\n",
    "    'sepal length', 'sepal width', 'petal length', 'petal width', 'label'\n",
    "]\n",
    "print(df.label.value_counts())\n",
    "print(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x122564390>"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 由于感知机是二分类算法，所以我们只取前两种鸢尾花的数据，并将数据可视化\n",
    "# 特征也只取两种，sepal length, sepal width\n",
    "plt.scatter(df[:50]['sepal length'], df[:50]['sepal width'], label='0')\n",
    "plt.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], label='1')\n",
    "# x轴为sepal length，y轴为sepal width\n",
    "# 可以看出，我们只使用了两个特征\n",
    "plt.xlabel('sepal length')\n",
    "plt.ylabel('sepal width')\n",
    "# 右上角就是legend\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "两个特征的意思是：$x \\rightarrow (x_0,x_1)$，在一元线性回归时，我们只有一个特征$x$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[5.1, 3.5, 0. ],\n",
       "       [4.9, 3. , 0. ],\n",
       "       [4.7, 3.2, 0. ],\n",
       "       [4.6, 3.1, 0. ],\n",
       "       [5. , 3.6, 0. ],\n",
       "       [5.4, 3.9, 0. ],\n",
       "       [4.6, 3.4, 0. ],\n",
       "       [5. , 3.4, 0. ],\n",
       "       [4.4, 2.9, 0. ],\n",
       "       [4.9, 3.1, 0. ],\n",
       "       [5.4, 3.7, 0. ],\n",
       "       [4.8, 3.4, 0. ],\n",
       "       [4.8, 3. , 0. ],\n",
       "       [4.3, 3. , 0. ],\n",
       "       [5.8, 4. , 0. ],\n",
       "       [5.7, 4.4, 0. ],\n",
       "       [5.4, 3.9, 0. ],\n",
       "       [5.1, 3.5, 0. ],\n",
       "       [5.7, 3.8, 0. ],\n",
       "       [5.1, 3.8, 0. ],\n",
       "       [5.4, 3.4, 0. ],\n",
       "       [5.1, 3.7, 0. ],\n",
       "       [4.6, 3.6, 0. ],\n",
       "       [5.1, 3.3, 0. ],\n",
       "       [4.8, 3.4, 0. ],\n",
       "       [5. , 3. , 0. ],\n",
       "       [5. , 3.4, 0. ],\n",
       "       [5.2, 3.5, 0. ],\n",
       "       [5.2, 3.4, 0. ],\n",
       "       [4.7, 3.2, 0. ],\n",
       "       [4.8, 3.1, 0. ],\n",
       "       [5.4, 3.4, 0. ],\n",
       "       [5.2, 4.1, 0. ],\n",
       "       [5.5, 4.2, 0. ],\n",
       "       [4.9, 3.1, 0. ],\n",
       "       [5. , 3.2, 0. ],\n",
       "       [5.5, 3.5, 0. ],\n",
       "       [4.9, 3.6, 0. ],\n",
       "       [4.4, 3. , 0. ],\n",
       "       [5.1, 3.4, 0. ],\n",
       "       [5. , 3.5, 0. ],\n",
       "       [4.5, 2.3, 0. ],\n",
       "       [4.4, 3.2, 0. ],\n",
       "       [5. , 3.5, 0. ],\n",
       "       [5.1, 3.8, 0. ],\n",
       "       [4.8, 3. , 0. ],\n",
       "       [5.1, 3.8, 0. ],\n",
       "       [4.6, 3.2, 0. ],\n",
       "       [5.3, 3.7, 0. ],\n",
       "       [5. , 3.3, 0. ],\n",
       "       [7. , 3.2, 1. ],\n",
       "       [6.4, 3.2, 1. ],\n",
       "       [6.9, 3.1, 1. ],\n",
       "       [5.5, 2.3, 1. ],\n",
       "       [6.5, 2.8, 1. ],\n",
       "       [5.7, 2.8, 1. ],\n",
       "       [6.3, 3.3, 1. ],\n",
       "       [4.9, 2.4, 1. ],\n",
       "       [6.6, 2.9, 1. ],\n",
       "       [5.2, 2.7, 1. ],\n",
       "       [5. , 2. , 1. ],\n",
       "       [5.9, 3. , 1. ],\n",
       "       [6. , 2.2, 1. ],\n",
       "       [6.1, 2.9, 1. ],\n",
       "       [5.6, 2.9, 1. ],\n",
       "       [6.7, 3.1, 1. ],\n",
       "       [5.6, 3. , 1. ],\n",
       "       [5.8, 2.7, 1. ],\n",
       "       [6.2, 2.2, 1. ],\n",
       "       [5.6, 2.5, 1. ],\n",
       "       [5.9, 3.2, 1. ],\n",
       "       [6.1, 2.8, 1. ],\n",
       "       [6.3, 2.5, 1. ],\n",
       "       [6.1, 2.8, 1. ],\n",
       "       [6.4, 2.9, 1. ],\n",
       "       [6.6, 3. , 1. ],\n",
       "       [6.8, 2.8, 1. ],\n",
       "       [6.7, 3. , 1. ],\n",
       "       [6. , 2.9, 1. ],\n",
       "       [5.7, 2.6, 1. ],\n",
       "       [5.5, 2.4, 1. ],\n",
       "       [5.5, 2.4, 1. ],\n",
       "       [5.8, 2.7, 1. ],\n",
       "       [6. , 2.7, 1. ],\n",
       "       [5.4, 3. , 1. ],\n",
       "       [6. , 3.4, 1. ],\n",
       "       [6.7, 3.1, 1. ],\n",
       "       [6.3, 2.3, 1. ],\n",
       "       [5.6, 3. , 1. ],\n",
       "       [5.5, 2.5, 1. ],\n",
       "       [5.5, 2.6, 1. ],\n",
       "       [6.1, 3. , 1. ],\n",
       "       [5.8, 2.6, 1. ],\n",
       "       [5. , 2.3, 1. ],\n",
       "       [5.6, 2.7, 1. ],\n",
       "       [5.7, 3. , 1. ],\n",
       "       [5.7, 2.9, 1. ],\n",
       "       [6.2, 2.9, 1. ],\n",
       "       [5.1, 2.5, 1. ],\n",
       "       [5.7, 2.8, 1. ]])"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# iloc方法用来取出数据，这里取出了df的前一百行数据中的第0，1，-1列。-1表示倒数第一列。\n",
    "# 然后数据类型转换为np.array类型\n",
    "data = np.array(df.iloc[:100, [0, 1, -1]])\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "# X为特征，:-1表示去掉最后一列，:表示所有数据\n",
    "X, y = data[:,:-1], data[:,-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 将分类0的ETL成分类为-1\n",
    "# 列表推导式，list comprehension <- haskell\n",
    "y = np.array([1 if i == 1 else -1 for i in y])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据线性可分，二分类数据\n",
    "# 此处为一元一次线性方程\n",
    "class Model:\n",
    "    # 类的构造函数，self相当于this\n",
    "    def __init__(self):\n",
    "        # w的初始值都为0\n",
    "        self.w = np.ones(len(data[0]) - 1, dtype=np.float32)\n",
    "        # b的初始值为0\n",
    "        self.b = 0\n",
    "        # 学习率或者步长为0.1\n",
    "        self.l_rate = 0.1\n",
    "        # self.data = data\n",
    "\n",
    "    # sign函数定义\n",
    "    def sign(self, x, w, b):\n",
    "        # dot为向量间的点乘，x 点乘 w\n",
    "        y = np.dot(x, w) + b\n",
    "        return y\n",
    "\n",
    "    # 随机梯度下降法，因为只根据误分类的点来更新，而不是所有样本点都更新，所以是随机梯度下降(SGD)\n",
    "    def fit(self, X_train, y_train):\n",
    "        # 是否误分类，初始化为正确分类\n",
    "        is_wrong = False\n",
    "        # 当样本点被误分类是\n",
    "        while not is_wrong:\n",
    "            # 误分类点的个数初始化为0\n",
    "            wrong_count = 0\n",
    "            # 遍历所有训练数据\n",
    "            # d是索引，[0, len(X_train))\n",
    "            for d in range(len(X_train)):\n",
    "                X = X_train[d]\n",
    "                y = y_train[d]\n",
    "                # 判断为真的话，表明训练数据点被误分类了\n",
    "                if y * self.sign(X, self.w, self.b) <= 0:\n",
    "                    # 参看教程的公式\n",
    "                    self.w = self.w + self.l_rate * np.dot(y, X)\n",
    "                    self.b = self.b + self.l_rate * y\n",
    "                    # 误分类点数量加一\n",
    "                    wrong_count += 1\n",
    "            # 误分类点都被正确分类了，退出循环\n",
    "            if wrong_count == 0:\n",
    "                is_wrong = True\n",
    "        return 'Perceptron Model!'\n",
    "\n",
    "    def score(self):\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Perceptron Model!'"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 实例化一个Model类\n",
    "perceptron = Model()\n",
    "# 训练感知机模型\n",
    "perceptron.fit(X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "由于我们的感知机模型为：\n",
    "\n",
    "$$\n",
    "f(x)=sign(wx+b),其中,sign(x)=\n",
    "\\begin{cases}\n",
    "-1 & x < 0 \\\\\n",
    "1 & x \\ge 0\n",
    "\\end{cases}\n",
    "$$\n",
    "\n",
    "所以我们知道，数据点的分割线的公式为：\n",
    "\n",
    "$$\n",
    "wx+b=0 \\\\\n",
    "w_0x_0+w_1x_1+b=0 \\\\\n",
    "x_1 = -\\frac{w_0x_0+b}{w_1}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x122718c90>"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 在指定的间隔内返回均匀间隔的数字\n",
    "x_points = np.linspace(4, 7, 10)\n",
    "# 翻译上一个单元格的公式\n",
    "y_ = -(perceptron.w[0] * x_points + perceptron.b) / perceptron.w[1]\n",
    "plt.plot(x_points, y_)\n",
    "\n",
    "# 设定一些绘图属性\n",
    "plt.plot(data[:50, 0], data[:50, 1], 'bo', color='blue', label='0')\n",
    "plt.plot(data[50:100, 0], data[50:100, 1], 'bo', color='orange', label='1')\n",
    "plt.xlabel('sepal length')\n",
    "plt.ylabel('sepal width')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### scikit-learn实例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import Perceptron"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Perceptron(alpha=0.0001, class_weight=None, early_stopping=False, eta0=1.0,\n",
       "           fit_intercept=False, max_iter=1000, n_iter_no_change=5, n_jobs=None,\n",
       "           penalty=None, random_state=0, shuffle=False, tol=0.001,\n",
       "           validation_fraction=0.1, verbose=0, warm_start=False)"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf = Perceptron(fit_intercept=False, max_iter=1000, shuffle=False)\n",
    "clf.fit(X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 16.3 -24.2]]\n"
     ]
    }
   ],
   "source": [
    "# Weights assigned to the features.\n",
    "# coef是系数的意思\n",
    "print(clf.coef_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.]\n"
     ]
    }
   ],
   "source": [
    "# 截距 Constants in decision function.\n",
    "print(clf.intercept_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1229d7e50>"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_ponits = np.arange(4, 8)\n",
    "y_ = -(clf.coef_[0][0]*x_ponits + clf.intercept_)/clf.coef_[0][1]\n",
    "plt.plot(x_ponits, y_)\n",
    "\n",
    "plt.plot(data[:50, 0], data[:50, 1], 'bo', color='blue', label='0')\n",
    "plt.plot(data[50:100, 0], data[50:100, 1], 'bo', color='orange', label='1')\n",
    "plt.xlabel('sepal length')\n",
    "plt.ylabel('sepal width')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
